#!/bin/bash
read -p "请输入正确的网段(eg:192.168.0.0/24)：" num
#grep匹配ip地址(0.0.0.0-255.255.255.255)
#由于正则表达式匹配数字是[0-9]的范围（可以[0-5],[2-7]）,所以把ip分为一位数(0-9)，两位数(10-99)，三位数(100-255)，三位数100-255不可以直接匹配又分为100-199(1开头的三位数)和200-255，又把200-255分为200-249和250-255，整体分为0-9,10-99,100-199,200-249,250-255
#正则：1[0-9]{2},代表1开头后面一位是0-9，匹配两次（{1,3}代表匹配1到3次）
#正则：|代表或
echo $num |grep -E "((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))\/(1[6-9]|2[0-9]|3[1-2])" &>/dev/null
ec=`echo $?`
if [ $ec -eq 0 ];then
   num2=`echo $num |awk -F "/" '{print $1" "$2}'`
   mask=`echo $num2 |awk '{print $2}'`
   num3=`echo $num2 |awk '{print $1}'`
    ip1=`echo $num3 |awk -F "."  '{print $1}'`
    ip2=`echo $num3 |awk -F "."  '{print $2}'`
    ip3=`echo $num3 |awk -F "."  '{print $3}'`
    ip4=`echo $num3 |awk -F "."  '{print $4}'`
else
  echo "输入有误，请输入正确的网段(eg:192.168.0.0/24)"
  exit
fi

if [ $mask -eq 16 ]&&[ $ip3 -eq 0 ]&&[ $ip4 -eq 0 ];then
      for i in {0..2}
      do
        for i2 in {0..2}
        do
           ping -c 1 $ip1.$ip2.$i.$i2 &>/dev/null
           jieguo16=`echo $?`
           if [ $jieguo16 -eq 0 ];then
               echo "ping $ip1.$ip2.$i.$i2 is OK" 
               #>>pingok
           else
             echo "ping $ip1.$ip2.$i.$i2 is not OK"
           # >>pingnotok
           fi
        done
      done
elif [ $mask -eq 24 ]&&[ $ip4 -eq 0 ];then
       for i24 in {1..254}
       do
          ping -c 1 $ip1.$ip2.$ip3.$i24 &>/dev/null
          jieguo24=`echo $?`
          if [ $jieguo24 -eq 0 ];then
               echo -e  "IP $ip1.$ip2.$ip3.$i24 \033[32m在线\033[0m"
               # >>pingok
          else
               echo -e "IP $ip1.$ip2.$ip3.$i24 \033[31m不在线\033[0m"
               # >>pingnotok
          fi
       done
else

      echo "输入有误，请输入正确的网段(eg:192.168.0.0/24)"
      exit
fi
